#define  _CRT_SECURE_NO_WARNINGS 1
#include "head.h"

//常见错误操作：

// 1、对NULL指针进行解引用操作
//int main()
//{
//	int* p = (int*)malloc(40);
//    ////这里要判断malloc是否成功
//    //if (p == NULL)
//    //{
//    //    perror("malloc failed\n");
//    //    return -1;
//    //}
//	int i = 0;
//    for (i = 0; i < 10; i++)
//    {
//        *(p + i) = i + 1; // 没有判断p是否为NULL
//    }
//    free(p);
//    p = NULL;
//
//	return 0;
//}


//2、对开辟空间的越界访问
//int main()
//{
//	int* p = (int*)malloc(40);
//    if (p == NULL)
//    {
//        perror("malloc failed\n");
//        return -1;
//    }
//	int i = 0;
//    for (i = 0; i <= 10; i++)
//    {
//        *(p + i) = i + 1; //当前i为10时，*(p+i)会访问到p[11]，这是非法越界访问，会报错
//    }
//    free(p);
//    p = NULL;
//
//	return 0;
//}


//3、对非动态申请空间进行free释放操作
//int main()
//{
//	int a = 10;
//    int* p = &a;
//
//    *p = 20;
//
//	free(p); // 非动态申请空间进行释放操作，会报错
//    p = NULL;
//
//	return 0;
//}


//4、使用free释放动态申请空间的一部分
//int main()
//{
//	int* p = (int*)malloc(40);
//    if (p == NULL)
//    {
//        perror("malloc failed\n");
//        return -1;
//    }
//	int i = 0;
//    for (i = 0; i < 5; i++)
//    {
//        *p = 5;
//        p++;
//    }
//
//    free(p); // p指向的地址不再是动态申请空间的起始地址
//    p = NULL;
//
//	return 0;
//}


//5、对同一块动态内存的重复多次释放
//int main()
//{
//    int* p = (int*)malloc(40);  
//    if (p == NULL)
//    {
//        perror("malloc failed\n");
//        return -1;
//    }
//    //free(p);
//    ////……
//    ////多行代码
//    ////……
//    //free(p);
//
//
//    free(p);
//    p = NULL; // --> 若及时将p置为NULL，则不会出现重复释放内存的错误
//    //……
//    free(p);
//
//    return 0;
//}


//6、忘记释放动态申请空间（内存泄漏）
//int* test()
//{
//    int* p = (int*)malloc(400);
//    if (p != NULL)
//    {
//        *p = 20;
//    }
//
//    //free(p); //--> 不再使用时记得释放
//    //p = NULL;
//
//    return p;
//}
//
//int main()
//{
//    //test();
//    ////出了test函数，p(临时)变量被销毁，p指向的空间没有释放，再也找不到了
//    
//    int* pr = test();// 或者返回指针，再进行释放
//    free(pr);
//    pr = NULL;
//    
//    while (1) // 死循环，让程序不退出
//    {
//        ;
//    }
//    return 0;
//}

//int main()
//{
//    //realloc也能实现malloc的效果
//    int* p = (int*)realloc(NULL, 40);
//    //等价于 int* p = (int*)malloc(40);
//}


//7、即使malloc和free成对使用，也可能出现内存泄漏
//void test()
//{
//    int* p = (int*)malloc(40);
//    if (p != NULL)
//    {
//        *p = 20;
//    }
//
//    int n = 10;
//    if (n > 0)
//        return;
//
//    free(p);
//    p = NULL;
//}
//
//int main()
//{
//    test();
//    return 0;
//}
